home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / asmbler.arc / FONTEDIT.ASM < prev    next >
Assembly Source File  |  1988-11-19  |  15KB  |  1,051 lines

  1.     PAGE    55,132
  2.     TITLE    FONTEDIT - Copyright 1983 Mathews Associates
  3.  
  4.     PUBLIC    INITIAL,FATAL,READIN,SETUP
  5.  
  6. ; General DOS invocation macro
  7.  
  8. DOS    MACRO    FNC,VAL,VBX,VCX,VDX,VSI,VDI
  9.     IFNB    <VDI>
  10.     MOV    DI,VDI
  11.     ENDIF
  12.     IFNB    <VSI>
  13.     MOV    SI,VSI
  14.     ENDIF
  15.     IFNB    <VDX>
  16.     MOV    DX,VDX
  17.     ENDIF
  18.     IFNB    <VCX>
  19.     MOV    CX,VCX
  20.     ENDIF
  21.     IFNB    <VBX>
  22.     MOV    BX,VBX
  23.     ENDIF
  24.     IFNB    <VAL>
  25.     MOV    AL,VAL
  26.     ENDIF
  27.     IFNB    <FNC>
  28.     MOV    AH,FNC
  29.     ENDIF
  30.     INT    33
  31.     ENDM
  32.  
  33. ; Internal print string macro (string, raster line, byte offset)
  34.  
  35. PRT    MACRO    STR,YCO,XCO
  36.     MOV    SI,OFFSET STR
  37.     MOV    DX,(YCO)*256+XCO
  38.     CALL    PRINT
  39.     ENDM
  40.  
  41. FE    SEGMENT
  42.  
  43.     ASSUME    CS:FE,DS:FE
  44.  
  45.     ORG    080H
  46. INLEN    DB    1 DUP (?)        ; Length of input from DOS
  47. INPUT    DB    127 DUP (?)        ; Input remnant from DOS
  48.  
  49.     ORG    0100H
  50.  
  51. START    PROC    NEAR
  52.     CALL    INITIAL            ; Clear screen and load font
  53.     MOV    INDEX,0            ; Select zero element for edit
  54.     CALL    EXEC            ; Execute commands issued
  55.     CALL    FINAL            ; Store fonts
  56.     MOV    AH,0            ; Restore screen state
  57.     MOV    AL,VSTATE
  58.     INT    16
  59.     DOS    76,0            ; and terminate
  60.  
  61. START    ENDP
  62.  
  63. NOTICE    DB    'FONTEDIT Copyright 1983 Mathews Associates',13,10,'$'
  64.  
  65. USAGE    DB    13,10,'FONTEDIT should be used with a pathname'
  66.     DB    ' of the font to be altered or created.',13,10
  67.     DB    'I.e. C>FONTEDIT \QUADSCREEN\FONTS\CH5X7.FON',13,10
  68.     DB    'If the extension is omitted then .FON will be assumed.',13,10
  69.     DB    '$'
  70.  
  71. FILEIS    DB    'Font:',0
  72.  
  73. XMSG    DB    'Enter width in dots of character font (4 <= N <= 32) :$'
  74.  
  75. YMSG    DB    'Enter height in dots of character font (4 <= N <= 32) :$'
  76.  
  77. FMSG    DB    'Fatal error has occurred.',13,10,'$'
  78.  
  79. QMSG1    DB    'Pressing F6 initiates the cancel edit sequence. The font',0
  80. QMSG2    DB    'definition file will be restored to the state it was in',0
  81. QMSG3    DB    'before FONTEDIT was executed. If this is what you want to',0
  82. QMSG4    DB    'do then press the F1 key now else press the F2 key to',0
  83. QMSG5    DB    'continue with the edit.',0
  84.  
  85. NMSG1    DB    'FONTEDIT Version 1.02 @ 1983 Mathews Associates',0
  86. NMSG2    DB    'F1 - Edit entry / Done        F2 - Cancel entry',0
  87. NMSG3    DB    'F3 - Edit with displayed data F4 - Edit with null data',0
  88. NMSG4    DB    'F5 - Exit and write font      F6 - Quit and cancel edit',0
  89. NMSG5    DB    'F7 - Disable pen              F8 - Unused',0
  90. NMSG6    DB    'F9 - Enable white pen         F& - Enable black pen',0
  91. NMSG7    DB    'Arrows are used to move between characters and dots.',0
  92. NMSG8    DB    'Diagonals may be used in character entry.',0
  93. NMSG9    DB    'Center key (5) toggles dot state (Num Lock must be on).',0
  94. NMSG10    DB    'Left hex value is character selected, right hex value is',0
  95. NMSG11    DB    'last character loaded into buffer.',0
  96.  
  97. HMSG    DB    '00 : 00',0
  98.  
  99. BITCURR    DB    000H,018H,018H,07EH,07EH,018H,018H,000H
  100.  
  101. BITON    DB    0BDH,03CH,0FFH,0FFH,0FFH,0FFH,03CH,0BDH
  102.  
  103. BITOFF    DB    081H,000H,000H,000H,000H,000H,000H,081H
  104.  
  105. DEFEXT    DB    '.FON',0
  106.  
  107. BAKEXT    DB    '.BAK',0
  108.  
  109. MASKS    DB    000H,080H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH
  110.  
  111. BITS    DB    080H,040H,020H,010H,008H,004H,002H,001H
  112.  
  113. PATH    DB    64 DUP (?)    ; Original path and file
  114.  
  115. BACKUP    DB    64 DUP (?)    ; Backup path and file
  116.  
  117. NEWFILE    DB    ?        ; New file flag
  118.  
  119. HANDLE    DW    ?        ; File handle
  120.  
  121. INDEX    DB    ?        ; Current character in set
  122.  
  123. XFONT    DB    ?        ; Width in bits
  124.  
  125. YFONT    DB    ?        ; Depth in rasters
  126.  
  127. XSIZE    DB    ?        ; Width in bytes
  128.  
  129. CSIZE    DB    ?        ; Total size of definition in bytes
  130.  
  131. XCURR    DB    ?        ; Current bit in buffer
  132.  
  133. YCURR    DB    ?        ; Current raster in buffer
  134.  
  135. EDMODE    DB    ?        ; Edit mode (1 = pen down, 2 = white/black pen)
  136.  
  137. VSTATE    DB    ?        ; Previous screen mode
  138.  
  139. ; Edit buffer:
  140.  
  141. TBUFF    DB    32/8*32 DUP (?)
  142.  
  143. ; Set buffer:
  144.  
  145. FBUFF    DB    32/8*32*256 DUP (?)
  146.  
  147. ; Load file and setup screen
  148.  
  149. INITIAL    PROC    NEAR
  150.     MOV    AH,15
  151.     INT    16
  152.     MOV    VSTATE,AL
  153.     DOS    9,,,,<OFFSET NOTICE>
  154.     TEST    INLEN,0FFH
  155.     JZ    INIT3
  156.     MOV    SI,OFFSET INPUT
  157.     MOV    CL,INLEN
  158.     XOR    CH,CH
  159. INIT1:
  160.     CMP    BYTE PTR ES:[SI],' '
  161.     JNZ    INIT2
  162.     INC    SI
  163.     LOOP    INIT1
  164.     JMP    SHORT INIT3
  165. INIT2:
  166.     CALL    READIN
  167.     CALL    SETUP
  168.     RET
  169. INIT3:
  170.     DOS    9,,,,<OFFSET USAGE>
  171.     DOS    76,0
  172.  
  173. INITIAL    ENDP
  174.  
  175. ; Execute commands until exit
  176.  
  177. EXEC    PROC    NEAR
  178.     MOV    EDMODE,0
  179.     CALL    DWBIG
  180. EXEC1:
  181.     MOV    DL,1
  182.     CALL    DWSMALL
  183.     CALL    KEYBD
  184.     JNC    EXEC1B
  185.     MOV    DL,0
  186.     CALL    DWSMALL
  187.     CALL    KEYBD
  188.     JNC    EXEC1A
  189.     JMP    EXEC1
  190. EXEC1A:
  191.     PUSH    AX
  192.     MOV    DL,1
  193.     CALL    DWSMALL
  194.     POP    AX
  195. EXEC1B:
  196.     CMP    AH,59
  197.     JNZ    EXEC2
  198.     MOV    XCURR,0
  199.     MOV    YCURR,0
  200.     MOV    AL,INDEX
  201.     MUL    CSIZE
  202.     ADD    AX,OFFSET FBUFF
  203.     MOV    SI,AX
  204.     MOV    DI,OFFSET TBUFF
  205.     MOV    AX,DS
  206.     MOV    ES,AX
  207.     MOV    CL,CSIZE
  208.     XOR    CH,CH
  209.     CLD
  210.     REP    MOVSB
  211.     CALL    EDIT
  212.     JMP    EXEC1
  213. EXEC2:
  214.     CMP    AH,61
  215.     JNZ    EXEC3
  216.     CALL    EDIT
  217.     JMP    EXEC1
  218. EXEC3:
  219.     CMP    AH,62
  220.     JNZ    EXEC4
  221.     MOV    DI,OFFSET TBUFF
  222.     MOV    AX,DS
  223.     MOV    ES,AX
  224.     MOV    CL,CSIZE
  225.     XOR    CH,CH
  226.     XOR    AX,AX
  227.     CLD
  228.     REP    STOSB
  229.     CALL    EDIT
  230.     JMP    EXEC1
  231. EXEC4:
  232.     CMP    AH,72
  233.     JNZ    EXEC5
  234.     MOV    DL,0
  235.     CALL    DWSMALL
  236.     SUB    INDEX,010H
  237.     MOV    DH,240
  238.     MOV    DL,0
  239.     MOV    AL,INDEX
  240.     CALL    PRHEX
  241.     JMP    EXEC1
  242. EXEC5:
  243.     CMP    AH,80
  244.     JNZ    EXEC6
  245.     MOV    DL,0
  246.     CALL    DWSMALL
  247.     ADD    INDEX,010H
  248.     MOV    DH,240
  249.     MOV    DL,0
  250.     MOV    AL,INDEX
  251.     CALL    PRHEX
  252.     JMP    EXEC1
  253. EXEC6:
  254.     CMP    AH,75
  255.     JNZ    EXEC7
  256.     MOV    DL,0
  257.     CALL    DWSMALL
  258.     MOV    AL,INDEX
  259.     MOV    AH,AL
  260.     AND    AH,0F0H
  261.     DEC    AL
  262.     AND    AL,00FH
  263.     OR    AL,AH
  264.     MOV    INDEX,AL
  265.     MOV    DH,240
  266.     MOV    DL,0
  267.     MOV    AL,INDEX
  268.     CALL    PRHEX
  269.     JMP    EXEC1
  270. EXEC7:
  271.     CMP    AH,77
  272.     JNZ    EXEC8
  273.     MOV    DL,0
  274.     CALL    DWSMALL
  275.     MOV    AL,INDEX
  276.     MOV    AH,AL
  277.     AND    AH,0F0H
  278.     INC    AL
  279.     AND    AL,00FH
  280.     OR    AL,AH
  281.     MOV    INDEX,AL
  282.     MOV    DH,240
  283.     MOV    DL,0
  284.     MOV    AL,INDEX
  285.     CALL    PRHEX
  286.     JMP    EXEC1
  287. EXEC8:
  288.     CMP    AH,63
  289.     JNZ    EXEC9
  290.     RET
  291. EXEC9:
  292.     CMP    AH,64
  293.     JNZ    EXEC10
  294.     CALL    QUERY
  295.     JC    EXEC10
  296.     MOV    AH,0            ; Restore screen state
  297.     MOV    AL,VSTATE
  298.     INT    16
  299.     DOS    76,0
  300. EXEC10:
  301.     JMP    EXEC1
  302.  
  303. EXEC    ENDP
  304.  
  305. ; Edit buffer until through
  306.  
  307. EDIT    PROC    NEAR
  308.     MOV    EDMODE,4
  309.     MOV    DH,240
  310.     MOV    DL,5
  311.     MOV    AL,INDEX
  312.     CALL    PRHEX
  313. EDIT1:
  314.     CALL    DWBIG
  315. EDIT2:
  316.     CALL    KEYBD
  317.     JC    EDIT2
  318.     CMP    AH,59
  319.     JNZ    EDIT3
  320.     MOV    AL,INDEX
  321.     MUL    CSIZE
  322.     ADD    AX,OFFSET FBUFF
  323.     MOV    DI,AX
  324.     MOV    SI,OFFSET TBUFF
  325.     MOV    CL,CSIZE
  326.     XOR    CH,CH
  327.     MOV    AX,DS
  328.     MOV    ES,AX
  329.     CLD
  330.     REP    MOVSB
  331.     MOV    EDMODE,0
  332.     CALL    DWBIG
  333.     RET
  334. EDIT3:
  335.     CMP    AH,60
  336.     JNZ    EDIT4
  337.     MOV    EDMODE,0
  338.     CALL    DWBIG
  339.     RET
  340. EDIT4:
  341.     CMP    AH,65
  342.     JNZ    EDIT5
  343.     AND    EDMODE,NOT 1
  344.     JMP    EDIT1
  345. EDIT5:
  346.     CMP    AH,67
  347.     JNZ    EDIT6
  348.     OR    EDMODE,3
  349.     CALL    EDMOVE
  350.     JMP    EDIT1
  351. EDIT6:
  352.     CMP    AH,68
  353.     JNZ    EDIT7
  354.     OR    EDMODE,1
  355.     AND    EDMODE,NOT 2
  356.     CALL    EDMOVE
  357.     JMP    EDIT1
  358. EDIT7:
  359.     CMP    AH,76
  360.     JNZ    EDIT8
  361.     CALL    ADDBIT
  362.     XOR    TBUFF[BX],AH
  363.     JMP    EDIT1
  364. EDIT8:
  365.     CMP    AH,71
  366.     JNZ    EDIT9
  367.     CALL    EDPTUP
  368.     CALL    EDPTLT
  369.     CALL    EDMOVE
  370.     JMP    EDIT1
  371. EDIT9:
  372.     CMP    AH,72
  373.     JNZ    EDIT10
  374.     CALL    EDPTUP
  375.     CALL    EDMOVE
  376.     JMP    EDIT1
  377. EDIT10:
  378.     CMP    AH,73
  379.     JNZ    EDIT11
  380.     CALL    EDPTUP
  381.     CALL    EDPTRT
  382.     CALL    EDMOVE
  383.     JMP    EDIT1
  384. EDIT11:
  385.     CMP    AH,75
  386.     JNZ    EDIT12
  387.     CALL    EDPTLT
  388.     CALL    EDMOVE
  389.     JMP    EDIT1
  390. EDIT12:
  391.     CMP    AH,77
  392.     JNZ    EDIT13
  393.     CALL    EDPTRT
  394.     CALL    EDMOVE
  395.     JMP    EDIT1
  396. EDIT13:
  397.     CMP    AH,79
  398.     JNZ    EDIT14
  399.     CALL    EDPTLT
  400.     CALL    EDPTDN
  401.     CALL    EDMOVE
  402.     JMP    EDIT1
  403. EDIT14:
  404.     CMP    AH,80
  405.     JNZ    EDIT15
  406.     CALL    EDPTDN
  407.     CALL    EDMOVE
  408.     JMP    EDIT1
  409. EDIT15:
  410.     CMP    AH,81
  411.     JNZ    EDIT16
  412.     CALL    EDPTDN
  413.     CALL    EDPTRT
  414.     CALL    EDMOVE
  415. EDIT16:
  416.     JMP    EDIT1
  417.  
  418. EDIT    ENDP
  419.  
  420. ; Move edit point up
  421.  
  422. EDPTUP    PROC    NEAR
  423.     MOV    AL,YCURR
  424.     OR    AL,AL
  425.     JNZ    EDUP1
  426.     MOV    AL,YFONT
  427. EDUP1:
  428.     DEC    AL
  429.     MOV    YCURR,AL
  430.     RET
  431.  
  432. EDPTUP    ENDP
  433.  
  434. ; Move edit point down
  435.  
  436. EDPTDN    PROC    NEAR
  437.     MOV    AL,YCURR
  438.     INC    AL
  439.     CMP    AL,YFONT
  440.     JB    EDDN1
  441.     XOR    AL,AL
  442. EDDN1:
  443.     MOV    YCURR,AL
  444.     RET
  445.  
  446. EDPTDN    ENDP
  447.  
  448. ; Move edit point left
  449.  
  450. EDPTLT    PROC    NEAR
  451.     MOV    AL,XCURR
  452.     OR    AL,AL
  453.     JNZ    EDLT1
  454.     MOV    AL,XFONT
  455. EDLT1:
  456.     DEC    AL
  457.     MOV    XCURR,AL
  458.     RET
  459.  
  460. EDPTLT    ENDP
  461.  
  462. ; Move edit point right
  463.  
  464. EDPTRT    PROC    NEAR
  465.     MOV    AL,XCURR
  466.     INC    AL
  467.     CMP    AL,XFONT
  468.     JB    EDRT1
  469.     XOR    AL,AL
  470. EDRT1:
  471.     MOV    XCURR,AL
  472.     RET
  473.  
  474. EDPTRT    ENDP
  475.  
  476. ; Paint new position if pen down
  477.  
  478. EDMOVE    PROC    NEAR
  479.     TEST    EDMODE,1
  480.     JNZ    EDMV1
  481.     RET
  482. EDMV1:
  483.     CALL    ADDBIT
  484.     TEST    EDMODE,2
  485.     JZ    EDMV2
  486.     OR    TBUFF[BX],AH
  487.     RET
  488. EDMV2:
  489.     NOT    AH
  490.     AND    TBUFF[BX],AH
  491.     RET
  492.  
  493. EDMOVE    ENDP
  494.  
  495. ; Get address and mask of current position
  496.  
  497. ADDBIT    PROC    NEAR
  498.     MOV    AL,YCURR
  499.     MUL    XSIZE
  500.     MOV    BL,XCURR
  501.     MOV    CL,3
  502.     SHR    BL,CL
  503.     XOR    BH,BH
  504.     ADD    AX,BX
  505.     MOV    BL,XCURR
  506.     AND    BL,7
  507.     MOV    BH,BITS[BX]
  508.     XCHG    AX,BX
  509.     RET
  510.  
  511. ADDBIT    ENDP
  512.  
  513. ; Rename old file to backup and write new file
  514.  
  515. FINAL    PROC    NEAR
  516.     TEST    NEWFILE,0FFH
  517.     JNZ    FINL6
  518.     MOV    AX,DS
  519.     MOV    ES,AX
  520.     MOV    SI,OFFSET PATH
  521.     MOV    DI,OFFSET BACKUP
  522.     CLD
  523. FINL1:
  524.     LODSB
  525.     OR    AL,AL
  526.     JZ    FINL2
  527.     STOSB
  528.     JMP    FINL1
  529. FINL2:
  530.     MOV    [DI],AL
  531.     LEA    SI,[DI-1]
  532.     STD
  533. FINL3:
  534.     LODSB
  535.     CMP    AL,'.'
  536.     JNZ    FINL3
  537.     LEA    DI,[SI+1]
  538.     MOV    SI,OFFSET BAKEXT
  539.     MOV    CX,5
  540.     CLD
  541.     REP    MOVSB
  542.     DOS    65,,,,<OFFSET BACKUP>
  543.     JNC    FINL4
  544.     CMP    AL,2
  545.     JNZ    FINL5
  546. FINL4:
  547.     DOS    86,,,,<OFFSET PATH>,,<OFFSET BACKUP>
  548.     JNC    FINL6
  549. FINL5:
  550.     CALL    FATAL
  551. FINL6:
  552.     DOS    60,,,0,<OFFSET PATH>
  553.     JC    FINL5
  554.     MOV    HANDLE,AX
  555.     DOS    64,,HANDLE,1,<OFFSET XFONT>
  556.     JC    FINL5
  557.     CMP    AX,CX
  558.     JNZ    FINL5
  559.     DOS    64,,HANDLE,1,<OFFSET YFONT>
  560.     JC    FINL5
  561.     CMP    AX,CX
  562.     JNZ    FINL5
  563.     MOV    CH,CSIZE
  564.     XOR    CL,CL
  565.     DOS    64,,HANDLE,,<OFFSET FBUFF>
  566.     JC    FINL5
  567.     CMP    AX,CX
  568.     JNZ    FINL5
  569.     DOS    62,,HANDLE
  570.     JC    FINL5
  571.     RET
  572.  
  573. FINAL    ENDP
  574.  
  575. ; Load font file
  576.  
  577. READIN    PROC    NEAR
  578.     MOV    AX,DS
  579.     MOV    ES,AX
  580.     MOV    DI,OFFSET PATH
  581.     PUSH    CX
  582.     CLD
  583.     REP    MOVSB
  584.     POP    CX
  585.     MOV    BYTE PTR [DI],0
  586.     MOV    SI,DI
  587.     STD
  588.     DEC    SI
  589. RDIN1:
  590.     LODSB
  591.     CMP    AL,'.'
  592.     JZ    RDIN3
  593.     CMP    AL,'\'
  594.     JZ    RDIN2
  595.     CMP    AL,'/'
  596.     JZ    RDIN2
  597.     LOOP    RDIN1
  598. RDIN2:
  599.     MOV    SI,OFFSET DEFEXT
  600.     MOV    CX,5
  601.     CLD
  602.     REP    MOVSB
  603.     DEC    DI
  604. RDIN3:
  605.     MOV    NEWFILE,0
  606.     DOS    61,0,,,<OFFSET PATH>
  607.     JNC    RDIN4
  608.     CMP    AL,2
  609.     JNZ    RDIN5
  610.     INC    NEWFILE
  611.     JMP    RDIN7
  612. RDIN4:
  613.     MOV    HANDLE,AX
  614.     DOS    63,,AX,1,<OFFSET XFONT>
  615.     JC    RDIN5
  616.     CMP    AX,1
  617.     JZ    RDIN6
  618. RDIN5:
  619.     CALL    FATAL
  620. RDIN6:
  621.     DOS    63,,HANDLE,1,<OFFSET YFONT>
  622.     JC    RDIN5
  623.     CMP    AX,1
  624.     JNZ    RDIN5
  625.     CALL    CALCSZ
  626.     DOS    63,,HANDLE,,<OFFSET FBUFF>
  627.     JC    RDIN5
  628.     CMP    AX,CX
  629.     JNZ    RDIN5
  630.     DOS    62,,HANDLE
  631.     JC    RDIN5
  632.     RET
  633. RDIN7:
  634.     MOV    SI,OFFSET XMSG
  635.     CALL    INVAL
  636.     MOV    XFONT,AL
  637.     MOV    SI,OFFSET YMSG
  638.     CALL    INVAL
  639.     MOV    YFONT,AL
  640.     CALL    CALCSZ
  641.     MOV    AX,DS
  642.     MOV    ES,AX
  643.     XOR    AL,AL
  644.     MOV    DI,OFFSET FBUFF
  645.     CLD
  646.     REP    STOSB
  647.     RET
  648.  
  649. READIN    ENDP
  650.  
  651. ; Calculate total font size
  652.  
  653. CALCSZ    PROC    NEAR
  654.     MOV    AL,XFONT
  655.     ADD    AL,7
  656.     MOV    CL,3
  657.     SHR    AL,CL
  658.     MOV    XSIZE,AL
  659.     MUL    YFONT
  660.     MOV    CSIZE,AL
  661.     MOV    CH,AL
  662.     XOR    CL,CL
  663.     RET
  664.  
  665. CALCSZ    ENDP
  666.  
  667. ; Setup screen and display current character set
  668.  
  669. SETUP    PROC    NEAR
  670.     CALL    CLEAR
  671.     MOV    INDEX,0
  672. SETP1:
  673.     XOR    DL,DL
  674.     CALL    DWSMALL
  675.     INC    INDEX
  676.     JNZ    SETP1
  677.     MOV    CX,32/8*32/2
  678.     MOV    DI,OFFSET TBUFF
  679.     MOV    AX,DS
  680.     MOV    ES,AX
  681.     CLD
  682.     XOR    AX,AX
  683.     REP    STOSW
  684.     PRT    NMSG1,0,0
  685.     PRT    FILEIS,20,0
  686.     PRT    PATH,20,6
  687.     PRT    NMSG2,40,0
  688.     PRT    NMSG3,50,0
  689.     PRT    NMSG4,60,0
  690.     PRT    NMSG5,70,0
  691.     PRT    NMSG6,80,0
  692.     PRT    NMSG7,95,0
  693.     PRT    NMSG8,105,0
  694.     PRT    NMSG9,115,0
  695.     PRT    NMSG10,130,0
  696.     PRT    NMSG11,140,0
  697.     PRT    HMSG,240,0
  698.     RET
  699.  
  700. SETUP    ENDP
  701.  
  702. ; Erase screen
  703.  
  704. CLEAR    PROC    NEAR
  705.     MOV    DX,0220H
  706.     MOV    AX,04000H
  707.     OUT    DX,AX
  708.     MOV    CX,08000H
  709.     MOV    AX,0D000H
  710.     MOV    ES,AX
  711.     XOR    AX,AX
  712.     REP    STOSW
  713.     RET
  714.  
  715. CLEAR    ENDP
  716.  
  717. ; Display current character at appropriate position
  718.  
  719. DWSMALL    PROC    NEAR
  720.     MOV    AX,0D000H
  721.     MOV    ES,AX
  722.     MOV    AL,INDEX
  723.     MOV    BH,AL
  724.     AND    BH,0F0H
  725.     MOV    BL,AL
  726.     AND    BL,00FH
  727.     MOV    CL,2
  728.     SHL    BL,CL
  729.     MUL    CSIZE
  730.     ADD    AX,OFFSET FBUFF
  731.     MOV    SI,AX
  732.     MOV    DH,YFONT
  733.     OR    DL,DL
  734.     JNZ    DWSM2
  735. DWSM1:
  736.     XOR    CH,CH
  737.     MOV    CL,XSIZE
  738.     MOV    DI,BX
  739.     CLD
  740.     REP    MOVSB
  741.     ADD    BX,128
  742.     DEC    DH
  743.     JNZ    DWSM1
  744.     RET
  745. DWSM2:
  746.     MOV    CX,BX
  747. DWSM3:
  748.     MOV    BL,XFONT
  749.     MOV    DI,CX
  750.     CLD
  751. DWSM4:
  752.     CMP    BL,8
  753.     JB    DWSM5
  754.     LODSB
  755.     NOT    AL
  756.     STOSB
  757.     SUB    BL,8
  758.     JMP    DWSM4
  759. DWSM5:
  760.     OR    BL,BL
  761.     JZ    DWSM6
  762.     LODSB
  763.     XOR    BH,BH
  764.     XOR    AL,MASKS[BX]
  765.     STOSB
  766. DWSM6:
  767.     ADD    CX,128
  768.     DEC    DH
  769.     JNZ    DWSM3
  770.     RET
  771.  
  772. DWSMALL    ENDP
  773.  
  774. ; Display edit buffer and corresponding character
  775.  
  776. DWBIG    PROC    NEAR
  777.     MOV    AX,0D000H
  778.     MOV    ES,AX
  779.     MOV    SI,OFFSET TBUFF
  780.     MOV    DH,YFONT
  781.     MOV    BX,256*128+70
  782.     CLD
  783. DWBG1:
  784.     MOV    DL,XFONT
  785.     MOV    DI,BX
  786. DWBG2:
  787.     MOV    AL,XFONT
  788.     XOR    AL,DL
  789.     AND    AL,7
  790.     JNZ    DWBG3
  791.     MOV    AH,[SI]
  792.     INC    SI
  793. DWBG3:
  794.     MOV    CX,8
  795.     PUSH    SI
  796.     PUSH    DI
  797.     MOV    SI,OFFSET BITON
  798.     SHL    AH,1
  799.     JC    DWBG4
  800.     MOV    SI,OFFSET BITOFF
  801. DWBG4:
  802.     LODSB
  803.     MOV    ES:[DI],AL
  804.     ADD    DI,128
  805.     LOOP    DWBG4
  806.     POP    DI
  807.     POP    SI
  808.     INC    DI
  809.     DEC    DL
  810.     JNZ    DWBG2
  811.     ADD    BX,128*8
  812.     DEC    DH
  813.     JNZ    DWBG1
  814.     MOV    SI,OFFSET TBUFF
  815.     MOV    BX,256*128+65
  816.     MOV    DH,YFONT
  817. DWBG5:
  818.     XOR    CH,CH
  819.     MOV    CL,XSIZE
  820.     MOV    DI,BX
  821.     CLD
  822.     REP    MOVSB
  823.     ADD    BX,128
  824.     DEC    DH
  825.     JNZ    DWBG5
  826.     TEST    EDMODE,4
  827.     JNZ    DWBG6
  828.     RET
  829. DWBG6:
  830.     MOV    AH,YCURR
  831.     XOR    AL,AL
  832.     SHL    AX,1
  833.     SHL    AX,1
  834.     OR    AL,XCURR
  835.     ADD    AX,256*128+70
  836.     MOV    DI,AX
  837.     MOV    SI,OFFSET BITCURR
  838.     MOV    CX,8
  839.     CLD
  840. DWBG7:
  841.     LODSB
  842.     XOR    ES:[DI],AL
  843.     ADD    DI,128
  844.     LOOP    DWBG7
  845.     RET
  846.  
  847. DWBIG    ENDP
  848.  
  849. ; Input value of font size
  850.  
  851. INVAL    PROC    NEAR
  852.     DOS    9,,,,SI
  853. IVAL1:
  854.     DOS    7
  855.     MOV    DL,AL
  856.     SUB    AL,'0'
  857.     JBE    IVAL1
  858.     CMP    AL,9
  859.     JA    IVAL1
  860.     MOV    BL,AL
  861.     DOS    2
  862. IVAL2:
  863.     DOS    7
  864.     MOV    DL,AL
  865.     CMP    AL,8
  866.     JNZ    IVAL3
  867.     DOS    2
  868.     JMP    IVAL1
  869. IVAL3:
  870.     CMP    AL,13
  871.     JNZ    IVAL4
  872.     CMP    BL,4
  873.     JB    IVAL2
  874.     JMP    IVAL7
  875. IVAL4:
  876.     SUB    AL,'0'
  877.     JC    IVAL2
  878.     CMP    AL,'9'
  879.     JA    IVAL2
  880.     MOV    AH,BL
  881.     ADD    AH,AH
  882.     ADD    AH,AH
  883.     ADD    AH,BL
  884.     ADD    AH,AH
  885.     ADD    AL,AH
  886.     CMP    AL,32
  887.     JA    IVAL2
  888.     MOV    BH,BL
  889.     MOV    BL,AL
  890.     DOS    2
  891. IVAL5:
  892.     DOS    7
  893.     MOV    DL,AL
  894.     CMP    AL,8
  895.     JNZ    IVAL6
  896.     MOV    BL,BH
  897.     DOS    2
  898.     JMP    IVAL2
  899. IVAL6:
  900.     CMP    AL,13
  901.     JNZ    IVAL5
  902.     CMP    BL,4
  903.     JB    IVAL5
  904. IVAL7:
  905.     MOV    DL,13
  906.     DOS    2
  907.     MOV    DL,10
  908.     DOS    2
  909.     MOV    AL,BL
  910.     RET
  911.  
  912. INVAL    ENDP
  913.  
  914. ; Insure user knows what quit does
  915.  
  916. QUERY    PROC    NEAR
  917.     PRT    QMSG1,160,0
  918.     PRT    QMSG2,170,0
  919.     PRT    QMSG3,180,0
  920.     PRT    QMSG4,190,0
  921.     PRT    QMSG5,200,0
  922. QURY1:
  923.     CALL    KEYBD
  924.     JC    QURY1
  925.     CMP    AH,59
  926.     JNZ    QURY2
  927.     CLC
  928.     RET
  929. QURY2:
  930.     CMP    AH,60
  931.     JNZ    QURY1
  932.     MOV    AX,0D004H
  933.     MOV    BX,160*128
  934.     MOV    DL,5*10
  935. QURY3:
  936.     MOV    DI,BX
  937.     XOR    AL,AL
  938.     MOV    CX,60
  939.     CLD
  940.     REP    STOSB
  941.     ADD    BX,128
  942.     DEC    DL
  943.     JNZ    QURY3
  944.     STC
  945.     RET
  946.  
  947. QUERY    ENDP
  948.  
  949. ; Check for input from the keyboard
  950.  
  951. KEYBD    PROC    NEAR
  952.     MOV    AH,1
  953.     INT    22
  954.     STC
  955.     JZ    KYBD1
  956.     XOR    AH,AH
  957.     INT    22
  958. KYBD1:
  959.     RET
  960.  
  961. KEYBD    ENDP
  962.  
  963. ; Display a value in hex in internal font
  964.  
  965. PRHEX    PROC    NEAR
  966.     MOV    BL,AL
  967.     MOV    CL,4
  968.     SHR    BL,CL
  969.     XOR    BH,BH
  970.     PUSH    AX
  971.     MOV    AL,HEXTAB[BX]
  972.     PUSH    DX
  973.     CALL    PCHAR
  974.     POP    DX
  975.     INC    DL
  976.     POP    AX
  977.     MOV    BL,AL
  978.     AND    BX,15
  979.     MOV    AL,HEXTAB[BX]
  980.     CALL    PCHAR
  981.     RET
  982.  
  983. HEXTAB    DB    '0123456789ABCDEF'
  984.  
  985. PRHEX    ENDP
  986.  
  987. ; Display a string on the screen in internal font
  988.  
  989. PRINT    PROC    NEAR
  990.     CLD
  991.     LODSB
  992.     OR    AL,AL
  993.     JZ    PRNT1
  994.     PUSH    DX
  995.     PUSH    SI
  996.     CALL    PCHAR
  997.     POP    SI
  998.     POP    DX
  999.     INC    DL
  1000.     JMP    PRINT
  1001. PRNT1:
  1002.     RET
  1003.  
  1004. PRINT    ENDP
  1005.  
  1006. ; Display a character on the screen in internal font
  1007.  
  1008. PCHAR    PROC    NEAR
  1009.     XOR    AH,AH
  1010.     MOV    SI,AX
  1011.     MOV    CL,3
  1012.     SHL    SI,CL
  1013.     ADD    SI,OFFSET MYFONT+2
  1014.     MOV    AX,0D004H
  1015.     MOV    ES,AX
  1016.     MOV    BH,DH
  1017.     XOR    BL,BL
  1018.     SHR    BX,1
  1019.     XOR    DH,DH
  1020.     ADD    BX,DX
  1021.     MOV    CX,8
  1022.     CLD
  1023. PCHR1:
  1024.     LODSB
  1025.     MOV    ES:[BX],AL
  1026.     ADD    BX,128
  1027.     LOOP    PCHR1
  1028.     RET
  1029.  
  1030. PCHAR    ENDP
  1031.  
  1032. ; Display fatal error message and terminate
  1033.  
  1034. FATAL    PROC    NEAR
  1035.     MOV    AH,0            ; Restore screen state
  1036.     MOV    AL,VSTATE
  1037.     INT    16
  1038.     DOS    9,,,,<OFFSET FMSG>
  1039.     DOS    76,0
  1040.  
  1041. FATAL    ENDP
  1042.  
  1043. ; Internal 8 x 8 font must be appended here
  1044. ; use command COPY FONTEDIT.BIN/B+< 8X8 font name >/B FONTEDIT.COM/B
  1045.  
  1046. MYFONT    LABEL    BYTE
  1047.  
  1048. FE    ENDS
  1049.  
  1050.     END    START
  1051.